#include <iostream>
#include <vector>

using namespace std;

void heapify(vector<int> &vec, int n, int i)
{
    int largest = i; //假设i下标的元素是最大的，相对于左孩子和右孩子
    int lson = 2 * i + 1; //左孩子下标
    int rson = 2 * i + 2; //右孩子下标

    //从节点和它的左右孩子中找出最大的数
    if(lson < n && vec[largest] < vec[lson])
        largest = lson;
    if(rson < n && vec[largest] < vec[rson])
        largest = rson;

    if(largest != i) //i下标的数相对于左右孩子不是最大的，需要交换
    {   
        swap(vec[largest], vec[i]);
        heapify(vec, n, largest); //递归调用，维护其他节点堆的性质
                                  //当前largest在lson或rson的位置，交换完最大数之后，较小数的位置为largest
    }
}

void heapify_build(vector<int> &vec, int n)
{
    //建堆
    int i;
    for(i = n / 2 - 1; i >= 0; i--) 
    {
        heapify(vec, n, i);
    }
    //排序
    for(i = n - 1; i > 0; i--)
    {
        swap(vec[i], vec[0]);
        heapify(vec, i, 0); 
    }
}

int main()
{
    int num;
    cin >> num;

    vector<int> vec;
    int temp;
    for(int i = 0; i < num; i++)
    {
        cin >> temp;
        vec.push_back(temp);
    }

    heapify_build(vec, num);

    for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}
